Aplikace do popredi

Otázka od: Jiri Hoffmayer

5. 12. 2003 11:41

Zdravim,

nedavno tady byl podobny thread ('Presun aplikacie do popredia'), ale ten mi
problem nevyresil.

Mam formular a nad nim modalni dialog s EditBoxem. Kazdych 5 sekund se
snazim presunout tohle do popredi a zamerit EditBox, aby se nestalo, ze se
uzivatel dostane do nejakych systemovych menu (jede to na Win2k a WinXP),
take pri startu systemu se spousti nejake dalsi aplikace a stane se, ze
zustanou nad moji, coz je nezadouci.

Tohle jsem vzdy resil pomoci Application.BringToFront nebo
SetForegroundWindow (jak znela moje rada v predchozim threadu), ale proste
to nejede. Na WinXP se jenom zvyrazni a blika tlacitko aplikace na liste, na
W2k jsem to primo nevidel, ale proste se to nepresune do popredi. Dokonce
ani nastaveni stylu vsech formularu na fsStayOnTop nefunguje dobre, snad
jen, ze by to bylo proto, ze tuhle property nastavuji az po CreateForm(), to
proto abych to mohl snadno vypnout, s fsStayOnTop se totiz dost spatne
debuguje  


Nevite jak to korektne vyresit, abych spolehlive dostal svoje formulare nad
ostatni?

Diky
Jirka D4


Odpovedá: Jiri Hoffmayer

8. 12. 2003 13:09

Opravdu nikdo nevi, jak spolehlive dostat aplikaci do popredi na Win2000/XP?

Jirka

----- Original Message -----
From: "Jiri Hoffmayer" <parsys@digitus.cz>
To: <delphi-l@clexpert.cz>
Sent: Friday, December 05, 2003 11:09 AM
Subject: Aplikace do popredi


>Zdravim,

>nedavno tady byl podobny thread ('Presun aplikacie do popredia'), ale ten
mi
>problem nevyresil.

>Mam formular a nad nim modalni dialog s EditBoxem. Kazdych 5 sekund se
>snazim presunout tohle do popredi a zamerit EditBox, aby se nestalo, ze se
>uzivatel dostane do nejakych systemovych menu (jede to na Win2k a WinXP),
>take pri startu systemu se spousti nejake dalsi aplikace a stane se, ze
>zustanou nad moji, coz je nezadouci.

>Tohle jsem vzdy resil pomoci Application.BringToFront nebo
>SetForegroundWindow (jak znela moje rada v predchozim threadu), ale proste
>to nejede. Na WinXP se jenom zvyrazni a blika tlacitko aplikace na liste,
na
>W2k jsem to primo nevidel, ale proste se to nepresune do popredi. Dokonce
>ani nastaveni stylu vsech formularu na fsStayOnTop nefunguje dobre, snad
>jen, ze by to bylo proto, ze tuhle property nastavuji az po CreateForm(),
to
>proto abych to mohl snadno vypnout, s fsStayOnTop se totiz dost spatne
>debuguje  


>Nevite jak to korektne vyresit, abych spolehlive dostal svoje formulare nad
>ostatni?

>Diky
>Jirka D4



Odpovedá: Karol Chupek

8. 12. 2003 15:27

neviem presne co chces a ci som sa trafil.
ale skus toto..

function ForceForegroundWindow(hwnd : Thandle) :BOOL;
var
   hCurWnd : Thandle;
begin
HcurWnd:=GetForeGroundWindow;
AttachThreadInput(GetWindowThreadProcessId(hcurwnd,nil),GetCurrentThreadID,t
rue);
result:=SetForeGroundWindow(hwnd);
AttachThreadInput(GetWindowThreadProcessId(hcurwnd,nil),GetCurrentThreadID,F
alse);
end;

> Opravdu nikdo nevi, jak spolehlive dostat aplikaci do popredi
> na Win2000/XP?
>
> Jirka
>


Odpovedá: Viktor Doubek

8. 12. 2003 15:27

Vydrz do zitra, dnes se dostanu domu ke starym zdrojakum a kdyz si vzpomenu,
urcite to tam najdu. VK


>Opravdu nikdo nevi, jak spolehlive dostat aplikaci do popredi na
>Win2000/XP?

>Jirka


Odpovedá: Jiri Hoffmayer

9. 12. 2003 20:10

Ahoj, nevim jestli je to ono, je to nejake podezrele. Predevsim ten prvni
AttachThreadInput(), kdy svazu input sveho procesu s nejakym jinym procesem,
ktery ma zrovna svoje okno v popredi. To fakt nevim jestli je to zadouci, i
kdyz je v nasledujicich krocich zase rozpojim...? Ze by proto, aby mi Windy
povolily presunout okno do popredi, protoze to muze udelat jenom aplikace,
ktera je zrovna v popredi?

Nemuze to mit nejaky vedlejsi efekt?

Pravda je, ze na pohled se zda, ze to funguje dobre!!   To by bylo super.

Jirka


----- Original Message -----
From: "Karol Chupek" <chupek@apollo.sk>
To: <delphi-l@clexpert.cz>
Sent: Monday, December 08, 2003 1:16 PM
Subject: Re: Aplikace do popredi


neviem presne co chces a ci som sa trafil.
ale skus toto..

function ForceForegroundWindow(hwnd : Thandle) :BOOL;
var
   hCurWnd : Thandle;
begin
HcurWnd:=GetForeGroundWindow;
AttachThreadInput(GetWindowThreadProcessId(hcurwnd,nil),GetCurrentThreadID,t
rue);
result:=SetForeGroundWindow(hwnd);
AttachThreadInput(GetWindowThreadProcessId(hcurwnd,nil),GetCurrentThreadID,F
alse);
end;

> Opravdu nikdo nevi, jak spolehlive dostat aplikaci do popredi
> na Win2000/XP?
>
> Jirka
>



Odpovedá: Petr Vones

9. 12. 2003 20:10

From: "Jiri Hoffmayer" <parsys@digitus.cz>
> Ahoj, nevim jestli je to ono, je to nejake podezrele. Predevsim ten prvni
> AttachThreadInput(), kdy svazu input sveho procesu s nejakym jinym procesem,
> ktery ma zrovna svoje okno v popredi. To fakt nevim jestli je to zadouci, i
> kdyz je v nasledujicich krocich zase rozpojim...? Ze by proto, aby mi Windy

Jiste ze je. Jinak system nedovoli prepnout okno vlastnene jinym threadem na
popredi.

Petr Vones


Odpovedá: Martin Schayna

9. 12. 2003 18:35

Jiri Hoffmayer <parsys@digitus.cz> wrote:
> Ahoj, nevim jestli je to ono, je to nejake podezrele. Predevsim ten
> prvni AttachThreadInput(), kdy svazu input sveho procesu s nejakym
> jinym procesem, ktery ma zrovna svoje okno v popredi. To fakt nevim
> jestli je to zadouci, i kdyz je v nasledujicich krocich zase
> rozpojim...? Ze by proto, aby mi Windy povolily presunout okno do
> popredi, protoze to muze udelat jenom aplikace, ktera je zrovna v
> popredi?
>
> Nemuze to mit nejaky vedlejsi efekt?

Ano, je to tak. Geneze je takovato: na originalnich Windows 95
API funkce SetForeGroundWindow normalne prepnula okno
do popredi, od Windows 98 (nebo SE, ted nevim) tato funkce
neprepne okno pokud neni jeho trhead aktivni, pouze se "rozblika"
tlacitko aplikace na taskbaru. Je to zrejme z toho duvodu aby
uzivatele pracujiciho v nejakem "neotravovaly" okna jina,
dozadujici se pozornosti.

Krome popsane vychytavky pomoci AttachThreadInput() lze
jeste aplikaci priradit compatibility mode pomoci registry.

Martin Schayna


Odpovedá: Jiri Hoffmayer

10. 12. 2003 10:48


>Krome popsane vychytavky pomoci AttachThreadInput() lze
>jeste aplikaci priradit compatibility mode pomoci registry.

Neco jsem v MSDN zahledl, ale tohle mi moc nevoni, hlavne ze to funguje
pomoci toho AttachThreadInput(). Kdyz nad tim premyslim, tak v tom asi zadny
hacek nebude, snad jenom ze po ziskani handle aktualniho top-most okna s nim
dal pracuju aniz bych mel zaruceno, ze zustane validni, asi by to chtelo
hodit do try-except, ostatni eventuality to zrejme prezije.

Diky,
Jirka


Odpovedá: Viktor Doubek

10. 12. 2003 11:26

Cau, posilal jsem to do konf. uz vcera dop., ale nejak to nevim proc
nedorazilo, takze druhy pokus (v txt priloze). Je to taky pres
AttachThreadInput(), ale jsou tam nejake dalsi kontroly ohledne ruznych verzi
Win. Ja to takhle pouzivam od nastupu W2K a bez problemu. VK


______________________________________________________________
> Od: "Jiri Hoffmayer" <parsys@digitus.cz>
> Komu: delphi-l@clexpert.cz
> CC:
> Datum: Wed, 10 Dec 2003 10:41:05 +0100
> Predmet: Re: Aplikace do popredi
>
>
> >Krome popsane vychytavky pomoci AttachThreadInput() lze
> >jeste aplikaci priradit compatibility mode pomoci registry.
>
> Neco jsem v MSDN zahledl, ale tohle mi moc nevoni, hlavne ze to funguje
> pomoci toho AttachThreadInput(). Kdyz nad tim premyslim, tak v tom asi zadny
> hacek nebude, snad jenom ze po ziskani handle aktualniho top-most okna s nim
> dal pracuju aniz bych mel zaruceno, ze zustane validni, asi by to chtelo
> hodit do try-except, ostatni eventuality to zrejme prezije.
>
> Diky,
> Jirka
>
>
>
>

--------------------
HOLANOVY VANOCNI TRHY na Vystavisti v Holesovicich. 6.-14.12.
Stany, spacaky, samonafukovacky, bundy.
 http://user.centrum.cz/redir.php?url=http://www.holan.cz



Odpovedá: Viktor Doubek

10. 12. 2003 11:50

Omlouvam se, mam trochu problem s www-mail-rozhranim, tady je ten kod:

function ForceForegroundWindow(hwnd: THandle): boolean;
const
  SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
  SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
  ForegroundThreadID: DWORD;
  ThisThreadID : DWORD;
  timeout : DWORD;
begin
  if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);
  if GetForegroundWindow = hwnd then
    Result := true
  else
  begin
    // Windows 98/2000 doesn't want to foreground a window when some other
    // window has keyboard focus
    if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
      ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
      ((Win32MajorVersion > 4) or
      ((Win32MajorVersion = 4) and
       (Win32MinorVersion > 0)))) then
    begin
      // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm>
      // Converted to Delphi by Ray Lischner
      // Published in The Delphi Magazine 55, page 16
      Result := false;
      ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow,nil);
      ThisThreadID := GetWindowThreadPRocessId(hwnd,nil);
      if AttachThreadInput(ThisThreadID, ForegroundThreadID, true) then
      begin
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hwnd);
        AttachThreadInput(ThisThreadID, ForegroundThreadID, false);
        Result := (GetForegroundWindow = hwnd);
      end;
      if not Result then begin
        // Code by Daniel P. Stasinski
        SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE);
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hWnd);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
      end;
    end
    else begin
      BringWindowToTop(hwnd); // IE 5.5 related hack
      SetForegroundWindow(hwnd);
    end;
    Result := (GetForegroundWindow = hwnd);
  end;
end; { ForceForegroundWindow }
ForceForegroundWindow(Application.Handle);

______________________________________________________________
> Od: "Viktor Doubek" <viktordoubek@centrum.cz>
> Komu: delphi-l@clexpert.cz
> CC:
> Datum: Wed, 10 Dec 2003 11:21:12 +0100
> Predmet: Re: Aplikace do popredi
>
> Cau, posilal jsem to do konf. uz vcera dop., ale nejak to nevim proc nedorazilo, takze druhy pokus (v txt priloze). Je to taky pres AttachThreadInput(), ale jsou tam nejake dalsi kontroly ohledne ruznych verzi Win. Ja to takhle pouzivam od nastupu W2K a bez problemu. VK
>
>
> ______________________________________________________________
> > Od: "Jiri Hoffmayer" <parsys@digitus.cz>
> > Komu: delphi-l@clexpert.cz
> > CC:
> > Datum: Wed, 10 Dec 2003 10:41:05 +0100
> > Predmet: Re: Aplikace do popredi
> >
> >
> > >Krome popsane vychytavky pomoci AttachThreadInput() lze
> > >jeste aplikaci priradit compatibility mode pomoci registry.
> >
> > Neco jsem v MSDN zahledl, ale tohle mi moc nevoni, hlavne ze to funguje
> > pomoci toho AttachThreadInput(). Kdyz nad tim premyslim, tak v tom asi zadny
> > hacek nebude, snad jenom ze po ziskani handle aktualniho top-most okna s nim
> > dal pracuju aniz bych mel zaruceno, ze zustane validni, asi by to chtelo
> > hodit do try-except, ostatni eventuality to zrejme prezije.
> >
> > Diky,
> > Jirka
> >
> >
> >
> >